package persistence;

import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

/**
 * Playlist enthält die Daten der Wiedergabeliste. 
 *
 * @author Patrick
 * @sinde 30.11.2011
 * 
 */
public class Playlist implements Serializable,List<Track>{

	private static final long serialVersionUID = 1L;
	private LinkedList<Track> trackList;
	private String name;
	
	/**
	 * erzeugt eine leere Wiedergabeliste.
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 */
	private Playlist(){
	   this.trackList = new LinkedList<Track>();		
	}
	
	/**
	 * Erzeugt eine Wiedergabeliste mit einem Titel 
	 * und einem Namen.
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 * @param track ist der Titel der Wiedergabeliste
	 * @param name ist der Name der Wiedergabeliste
	 */
	public Playlist(Track track,String name) {
		this(name);
		this.trackList.add(track);
	}
	
	/**
	 * Erzeugt eine wiedergabeliste von einer bestehenden Titelliste<br>
	 * mit einem entsprechenden Namen.
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 * @param trackList ist die Titelliste auf die sich die Wiedergabeliste bezieht.
	 * @param name ist Name der Wiedergabeliste.
	 */
	public Playlist(List<Track> trackList,String name){
		this(name);
		this.trackList.addAll(trackList);
	}
	
	/**
	 * Erzeugt eine leere Liste mit einem Namen
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 * @param name
	 */
	public Playlist(String name){
		this();
		this.name = name;
	}
	
	/**
	 * gibt den Ersten Track der Liste zurück.
	 *
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @return
	 */
	public Track getFirst() {
		return this.trackList.peekFirst();
	}

	/**
	 * Gibt den letzten Track der Liste zurück.
	 *
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @return
	 */
	public Track getLast(){
		return this.trackList.peekLast();
	}
	
	/**
	 * Löscht einen Track an der stelle index aus der Liste.
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#remove(int)
	 */
	public Track remove(int index){
		return this.trackList.remove(index);
	}
	
	/**
	 * Entfernt den Übergebenen Track aus der Wiedergabeliste.
	 *
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @param t
	 */
	public void remove(Track t){
		this.trackList.remove(t);
	}
	
	/**
	 * Gibt den Namen der Wiedergabeliste zurück.
	 *
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @return
	 */
	public String getName() {
		return this.name;
	}
	
	/**
	 * Setzt den Namen der Wiedergabeliste.
	 *
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @param name
	 */
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	/**
	 * Gibt die Anzahl der Elemente der Liste zurück.
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#size()
	 */
	public int size() {
		return this.trackList.size();
	}

	@Override
	/**
	 * Gibt true zurück wenn die Liste leer ist.
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#isEmpty()
	 */
	public boolean isEmpty() {
		return this.trackList.isEmpty();
	}

	@Override
	/**
	 * Überprüft ob das Objekt sich in der Liste befindet.
	 * <br> -> equals() ist überschrieben funktioniert also auch mit Track
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#contains(java.lang.Object)
	 */
	public boolean contains(Object o) {
		return this.trackList.contains(o);
	}
	
	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#iterator()
	 */
	public Iterator<Track> iterator() {
		return this.trackList.iterator();
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#toArray()
	 */
	public Object[] toArray() {
		return this.trackList.toArray();
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#toArray(T[])
	 */
	public <T> T[] toArray(T[] a) {
		return this.trackList.toArray(a);
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#remove(java.lang.Object)
	 */
	public boolean remove(Object o) {
		return this.trackList.remove(o);
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#containsAll(java.util.Collection)
	 */
	public boolean containsAll(Collection<?> c) {
		return this.trackList.containsAll(c);
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#addAll(java.util.Collection)
	 */
	public boolean addAll(Collection<? extends Track> c) {
		return trackList.addAll(c);
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#removeAll(java.util.Collection)
	 */
	public boolean removeAll(Collection<?> c) {
		return this.trackList.removeAll(c);
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#retainAll(java.util.Collection)
	 */
	public boolean retainAll(Collection<?> c) {
		return this.trackList.retainAll(c);
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#clear()
	 */
	public void clear() {
		this.trackList.clear();
	}

	@Override
	/**
	 * prüft vorab ob der track vorhanden ist wenn <br>
	 * ja fügt er keinen neuen hinzu und gibt false zurück
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#add(java.lang.Object)
	 */
	public boolean add(Track t){
		if(!this.contains(t)){
			this.trackList.add(t);
			return true;
		}else
			return false;
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#addAll(int, java.util.Collection)
	 */
	public boolean addAll(int index, Collection<? extends Track> c) {
		return this.trackList.addAll(index, c);
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#get(int)
	 */
	public Track get(int index) {
		return this.trackList.get(index);
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#set(int, java.lang.Object)
	 */
	public Track set(int index, Track element) {
		return this.trackList.set(index, element);
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#add(int, java.lang.Object)
	 */
	public void add(int index, Track element) {
		this.trackList.add(index, element);
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#indexOf(java.lang.Object)
	 */
	public int indexOf(Object o) {
		return this.trackList.indexOf(o);
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#lastIndexOf(java.lang.Object)
	 */
	public int lastIndexOf(Object o) {
		return this.trackList.indexOf(o);
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#listIterator()
	 */
	public ListIterator<Track> listIterator() {
		return this.trackList.listIterator();
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#listIterator(int)
	 */
	public ListIterator<Track> listIterator(int index) {
		return this.trackList.listIterator(index);
	}

	@Override
	/**
	 * 
	 * @author Patrick
	 * @since 30.11.2011
	 *
	 * @see java.util.List#subList(int, int)
	 */
	public List<Track> subList(int fromIndex, int toIndex) {
		return this.trackList.subList(fromIndex, toIndex);
	}

}
